/**
 * 通用请求方法
 * @param {Object} options 请求配置
 * @param {string} options.url 请求URL
 * @param {string} [options.method='get'] 请求方法 (get/post/put/delete/patch)
 * @param {Object} [options.headers] 请求头
 * @param {Object} [options.params] GET请求参数
 * @param {Object} [options.data] POST/PUT等请求体数据
 * @returns {Promise} 返回useFetch的结果
 */
export default function request(options) {
	console.log('[Request Options]', options);

	const runtimeConfig = useRuntimeConfig();
	// 默认配置
	const defaultOptions = {
		baseURL: runtimeConfig.public.BASE_URL,
		headers: {
			'Content-Type': 'application/json',
			...(options.headers || {}),
		},
		timeout: 5000, // 5秒超时
	};

	const fetchOptions = {
		...defaultOptions,
		method: options.method || 'get',
		...getDataByMethod(options.method, options),
	};

	return useFetch(options.url, {
		...fetchOptions,

		// 请求拦截器
		onRequest({ request, options }) {
			console.log('[Request]', request, options);

			// 可以在这里添加认证token
			// const token = useCookie('token');
			// if (token.value) {
			//   options.headers.Authorization = `Bearer ${token.value}`;
			// }
		},

		// 请求错误处理
		onRequestError({ request, options, error }) {
			console.error('[Request Error]', error);
			// throw createError({
			// 	statusCode: 500,
			// 	statusMessage: '请求发送失败',
			// 	fatal: true,
			// });
		},

		// 响应拦截器
		onResponse({ request, response, options }) {
			console.log('[Response]', response);

			// 可以在这里统一处理响应格式
			// if (response._data.code !== 0) {
			//   throw createError({
			//     statusCode: response._data.code,
			//     statusMessage: response._data.message
			//   });
			// }
		},

		// 响应错误处理
		onResponseError({ request, response, options }) {
			console.error('[Response Error]', response);

			// 根据HTTP状态码处理不同错误
			const status = response.status || 500;
			const message = response._data?.message || '请求处理失败';

			// throw createError({
			// 	statusCode: status,
			// 	statusMessage: message,
			// 	fatal: true,
			// });
		},
	});
}

/**
 * 根据请求方法处理参数
 * @param {string} method 请求方法
 * @param {Object} options 请求配置
 * @returns {Object} 处理后的参数对象
 */
const getDataByMethod = (method = 'get', options) => {
	const methodType = (method || 'get').toLowerCase();

	if (methodType === 'get') {
		return { query: options.params };
	}

	return { body: options.data };
};
